package com.mpm.ai.controller;


import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.QuestionAnswerAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.vectorstore.VectorStore;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.time.LocalDateTime;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

@RestController
@CrossOrigin
public class AiController {

    ChatClient chatClient;

    // ==================================注入 chatClient 并使用=============================================
/*
    public AiController(ChatClient.Builder chatClientBuilder) {
        this.chatClient = chatClientBuilder.build();
    }

//
//    @CrossOrigin
//    @GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
//    public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {
////        return chatClient.prompt().user(message).call().content();
//        return chatClient.prompt().user(message).stream().content();
//    }


    @CrossOrigin
    @GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {
        Flux<String> content = chatClient.prompt().user(message).stream().content();
        return content.concatWith(Flux.just("[complete]"));
    }*/

    // =====================================添加对话记忆功能==========================================

/*    public AiController(ChatClient.Builder chatClientBuilder, ChatMemory chatMemory) {
        this.chatClient = chatClientBuilder
                .defaultAdvisors(new PromptChatMemoryAdvisor(chatMemory), new SimpleLoggerAdvisor())
                .build();
    }

    @CrossOrigin
    @GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {
        Flux<String> content = chatClient.prompt().user(message)
                // 区分用户对话
                .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, "1"))
                // 携带对话条数
                .advisors(a -> a.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                .stream().content();
        return content.concatWith(Flux.just("[complete]"));
    }
*/
    // =======================================预设角色========================================
/*

    public AiController(ChatClient.Builder chatClientBuilder, ChatMemory chatMemory) {
        this.chatClient = chatClientBuilder
                .defaultSystem("""
                        美平米科技有限公司（全称：杭州美平米科技有限公司）是一家成立于2017年的国家高新技术企业，专注于服装行业数字化解决方案，核心产品包括云e宝、云e宝(工厂版)、云小叮等系列软件，提供从工厂生产到批发零售的全链路管理服务。
                        您是美平米科技有限公司的客户聊天支持代理。请以友好、乐于助人且愉快的方式来回复。
                        请讲中文。
					    今天的日期是 {current_date}。
                        """)
                .defaultAdvisors(new PromptChatMemoryAdvisor(chatMemory), new SimpleLoggerAdvisor())
                .build();
    }

    @CrossOrigin
    @GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {
        Flux<String> content = chatClient.prompt().user(message)
                .system(s -> s.param("current_date", LocalDateTime.now()))
                // 区分用户对话
                .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, "1"))
                // 携带对话条数
                .advisors(a -> a.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                .stream().content();
        return content.concatWith(Flux.just("[complete]"));
    }*/


    // ======================================function call=========================================

/*

    public AiController(ChatClient.Builder chatClientBuilder, ChatMemory chatMemory) {
        this.chatClient = chatClientBuilder
                .defaultSystem("""
                        美平米科技有限公司（全称：杭州美平米科技有限公司）是一家成立于2017年的国家高新技术企业，专注于服装行业数字化解决方案，核心产品包括云e宝、云e宝(工厂版)、云小叮等系列软件，提供从工厂生产到批发零售的全链路管理服务。
                        您是美平米科技有限公司的客户聊天支持代理。请以友好、乐于助人且愉快的方式来回复。
                        在提供有关取消订单的信息之前，您必须始终从用户处获取以下信息：订单号。
                        在提供有关创建订单或者新增订单的信息之前，您必须始终从用户处获取以下信息：商品、数量。
                        在询问用户之前，请检查消息历史记录以获取此信息。
                        请讲中文。
					    今天的日期是 {current_date}。
                        """)
                .defaultAdvisors(new PromptChatMemoryAdvisor(chatMemory), new SimpleLoggerAdvisor())
                .defaultFunctions("cancelOrder", "createOrder")
                .build();
    }

    @CrossOrigin
    @GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {
        Flux<String> content = chatClient.prompt().user(message)
                .system(s -> s.param("current_date", LocalDateTime.now()))
                // 区分用户对话
                .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, "1"))
                // 携带对话条数
                .advisors(a -> a.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                .stream().content();
        return content.concatWith(Flux.just("[complete]"));
    }
*/


    // ======================================rag=========================================

    public AiController(ChatClient.Builder chatClientBuilder, ChatMemory chatMemory, VectorStore vectorStore) {
        this.chatClient = chatClientBuilder
                .defaultSystem("""
                        美平米科技有限公司（全称：杭州美平米科技有限公司）是一家成立于2017年的国家高新技术企业，专注于服装行业数字化解决方案，核心产品包括云e宝、云e宝(工厂版)、云小叮等系列软件，提供从工厂生产到批发零售的全链路管理服务。
                        您是美平米科技有限公司的客户聊天支持代理。请以友好、乐于助人且愉快的方式来回复。
                        在提供有关取消订单的信息之前，您必须始终从用户处获取以下信息：订单号。
                        在提供有关创建订单或者新增订单的信息之前，您必须始终从用户处获取以下信息：商品、数量。
                        在询问用户之前，请检查消息历史记录以获取此信息。
                        请讲中文。
					    今天的日期是 {current_date}。
                        """)
                .defaultAdvisors(
                        new PromptChatMemoryAdvisor(chatMemory),
                        new SimpleLoggerAdvisor(),
                        new QuestionAnswerAdvisor(vectorStore))
                .defaultFunctions("cancelOrder", "createOrder")
                .build();
    }

    @CrossOrigin
    @GetMapping(value = "/ai/generateStreamAsString", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    public Flux<String> generateStreamAsString(@RequestParam(value = "message", defaultValue = "讲个笑话") String message) {
        Flux<String> content = chatClient.prompt().user(message)
                .system(s -> s.param("current_date", LocalDateTime.now()))
                // 区分用户对话
                .advisors(a -> a.param(CHAT_MEMORY_CONVERSATION_ID_KEY, "1"))
                // 携带对话条数
                .advisors(a -> a.param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100))
                .stream().content();
        return content.concatWith(Flux.just("[complete]"));
    }

}
